为什么你的 Prompt 总是跑偏 - 从语义漂移到注意力稀释
Transformer 每一步都基于当前上下文算下一个 token 的概率;生成出来的 token 又会塞回上下文,改下一步的分布。跑偏,多半不是听不懂,是这条概率链被带歪了。
原理
语义漂移 —— 拐弯了。模型顺着中间产物一路跑,子问题变成主线,最初要干啥忘干净了。让它清磁盘,它从查日志追到 SSL,再追到 DNS……一步比一步合理,离目标越来越远。不及时纠偏,后面整段白聊。
注意力稀释 —— 一开始的要求忘了。上下文一长,早期约束就被冲淡。说好用中文,聊着聊着开始写英文,得再吼一句「说中文!」才拉回来。
语义惯性 —— 上文决定下文。前面几轮全是 rm -rf、prune -f,-f 的权重已经拉很高了;你再让它「归档重要配置,别丢」,它还是可能下意识接上激进清理。很多误删盘,就是这么来的。
语义壁垒 —— 难题直接逼答案,模型一着急就胡说。让它先想再答,往往就过了。也就是 CoT(Chain of Thought,思维链)。
相变 —— 哪怕胡言乱语,也可能把采样扳回路上。「多说点废话,慢慢想」,答案反而对了。但乱说也会带回漂移和稀释,双刃剑。
特征纠缠 —— 想加一个特点,顺带带出一堆相关的。你说「回答要严谨」,想要的是逻辑准,模型却一起变成学术腔、术语一大堆。所以得写成:「逻辑要严谨,但表达简短、口语化,不展开背景。」想加什么,就把不想要的副作用也钉死。
实战技巧
复杂问题约束太多,反而把 AI 压死。先发散后收敛:多要几种方案,再按自己的约束挑一个落地。
先推理后结论。很多人(包括我)喜欢第一句就给结论,后面再展开。问题是结论一旦先出来,后面的「推理」就只能围着它圆谎。结论错了,整段废。
入戏与共振采样。连续砸同类关键词,把 AI 锁进人设,别让它滑回默认的热情助手。破碎、灰烬、干笑这类词砸够了,氛围才站得住。
隐式语义优于显式语义(当然,显式/隐式是相对的,否则啥指令都能算显式)。
隐式: 请按照 Kubernetes controller-runtime 项目的代码质量标准实现这个 HTTP client。
显式: 不要使用全局变量。HTTP 请求必须设置超时。失败后最多重试两次。使用结构化日志。
隐式能一次打包一整套品味,但会特征纠缠,得靠显式配平收敛:想要的往上拉,不想要的往下压。
配平又带来新麻烦。
模型本来就会 md,你还把 #、**、* 一条条列出来,等于在强调「这些词很重要」——知识冗余。
然后就是注意力劫持:显式举例有引力,生成内容会被这些词拽偏,文章为了展示语法而生硬堆砌。
还有认知降维:步骤写太细,模型就被钉死在你那几条命令上,全局更优解想都不敢想。你的约束,有时候比模型上限更窄。
所以最后往往又回到隐式提纯:别列属性了,丢个高纯度压缩包。直接说「你是 JARVIS」,比逐条描述英式幽默、略傲慢、叫我 Sir 更有灵魂。这词里当然有漫威杂质,但特定场景下,它就是高纯度语义。
说来说去,很容易变成 咸了 → 加水 → 淡了 → 加盐 的死循环。
结论
引导采样与回滚:先用一堆话帮模型想清楚,拿到准关键词;再开新对话,只用这些词重问。回滚是为了甩掉引导过程里积下的注意力污染。
案例好于说明。ls -al | grep 这一行,就已经告诉模型这是 Linux 生态,不必再废话解释环境。
引入数学符号和数学语义。自然语言熵高,容易变成公关腔、和稀泥。换成因果式、代入式的符号,模型更容易给可判定的结论,而不是一段正确的废话。
抽象概念也可以丢「第一性原理」「奥卡姆剃刀」这类催化剂 token,把表达压短、压干净。
参考并感谢:https://linux.do/t/topic/2538870
<完>